package com.huaxin.hxenum.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import com.huaxin.hxenum.base.BaseCodeEnum;

/**
 * 设备类型枚举 (Device Type)
 * 用于区分配电系统中不同种类的采集与监测设备
 */
public enum DeviceType implements BaseCodeEnum<String> {

    // -------------------- 电力监测设备 --------------------
    /**
     * 10kV电力监测仪表
     * 用于高压配电回路的电参量采集，支持电压、电流、功率、电能等参数监测
     */
    POWER_METER_10KV("power_meter_10kv", "10kV电力监测仪表"),

    /**
     * 0.4kV电力监测仪表
     * 用于低压配电回路的电参量采集，常见于出线柜或重要负载回路
     */
    POWER_METER_04KV("power_meter_04kv", "0.4kV电力监测仪表"),

    /**
     * 微机保护装置
     * 具备继电保护、遥测、遥信、遥控功能的智能保护设备，可上报故障录波等信息
     */
    MICROPROCESSOR_RELAY("microprocessor_relay", "微机保护"),

    // -------------------- 环境与状态监测设备 --------------------
    /**
     * 配电房环境监测主机
     * 集成温湿度、水浸、烟雾、门磁等多种传感器数据的采集与上传
     */
    ENV_MONITOR_ROOM("env_monitor_room", "配电房环境监测"),

    /**
     * 变压器温控仪
     * 用于干式变压器绕组温度实时监测，支持风机启停控制与超温报警
     */
    TRANSFORMER_TEMP_CONTROLLER("transformer_temp_controller", "变压器温控仪"),

    /**
     * 无线测温主机
     * 接收来自无线测温探头（如开关柜触头）的温度数据，支持多通道接入
     */
    WIRELESS_TEMP_HOST("wireless_temp_host", "无线测温主机"),

    // -------------------- 信号采集模块 --------------------
    /**
     * 有源信号监测模块
     * 用于采集有源模拟量（4-20mA/0-10V）或有源开关量信号
     */
    ACTIVE_SIGNAL_MODULE("active_signal_module", "有源信号监测模块"),

    /**
     * 无源信号监测模块
     * 用于采集无源干接点信号（如断路器位置、故障输出等）
     */
    PASSIVE_SIGNAL_MODULE("passive_signal_module", "无源信号监测模块"),
    /**
     * 监控相机
     */
    SURVEILLANCE_CAMERA("surveillance_camera", "监控相机");

    @EnumValue // MyBatis Plus：标识该字段写入数据库
    private final String code;

    private final String displayName;

    DeviceType(String code, String displayName) {
        this.code = code;
        this.displayName = displayName;
    }

    @JsonValue // Jackson：序列化为 JSON 时使用此方法
    @Override
    public String getCode() {
        return code;
    }

    @Override
    public String getDisplayName() {
        return displayName;
    }

    /**
     * 根据 code 获取对应的枚举实例
     *
     * @param code 设备类型代码（如 "power_meter_10kv"）
     * @return 对应的 DeviceType 枚举，未找到返回 null
     */
    public static DeviceType of(String code) {
        if (code == null || code.trim().isEmpty()) {
            return null;
        }
        for (DeviceType type : values()) {
            if (type.getCode().equalsIgnoreCase(code.trim())) {
                return type;
            }
        }
        return null;
    }

    /**
     * 判断指定的 code 是否为有效的设备类型
     *
     * @param code 待验证的设备类型 code
     * @return true 表示是有效类型
     */
    public static boolean isValid(String code) {
        return of(code) != null;
    }

    /**
     * 从数据库或外部系统获取的字符串转换为枚举，失败时返回默认值
     *
     * @param code       原始编码
     * @param defaultVal 默认枚举值
     * @return 解析成功返回对应枚举，否则返回默认值
     */
    public static DeviceType ofOrDefault(String code, DeviceType defaultVal) {
        DeviceType result = of(code);
        return result != null ? result : defaultVal;
    }
}